package rs.in.idemdo;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Vector;

import org.restlet.resource.ClientResource;
import org.restlet.resource.ResourceException;

import restlet.interfaces.TripLineResourceI;
import rs.in.idemdo.db.IdemDoDbAdapter;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import beans.CarrierBean;
import beans.MestoBean;
import beans.TripCatBean;
import beans.TripLine;
import beans.TripPartBean;

public class RezultatiPretrageActivity extends Activity {

	/** The progress dialog used during the interactions with the server. */
	private ProgressDialog mProgresDijalog;
	/** Dijalog za prijavljivanje greske */
	private AlertDialog mAlertDijalog;

	private IdemDoDbAdapter mIdemDoDbAdapter;

	/** lista podataka o putnoj liniji. Koristi se u SimpleAdapteru */
	private ArrayList<HashMap<String, Object>> mListaRezultata = new ArrayList<HashMap<String, Object>>();
	private TripLineResourceI mTripLinesResource;
	private Vector<TripLine> mTripLines;

	// nazivi podataka u HashMapi. Konstante sa glupim brojevima (mogu biti i
	// slova, nesto drugo)
	private static final String MESTO_OD = "m_od";
	private static final String MESTO_DO = "m_do";
	private static final String BROJ_PRESEDANJA = "br_pr";
	private static final String INFO_BOX = "info";
	private static final String OD_IKONICA = "od_ik";
	private static final String MEDJU_IKONICA = "medj_ik";
	private static final String DO_IKONICA = "do_ik";

	public static final String TRIP_LINE = "tripLine";
	private static final int POCETNA_POZICIJA = 1;

	private static final int SREDNJA_POZICIJA = 2;

	private static final int KRAJNJA_POZICIJA = 3;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.rezultati_pretrage);

		// mockPodaci();// mora pre AdaptirajList
		// adaptirajListView();

		mIdemDoDbAdapter = new IdemDoDbAdapter(this);
		mIdemDoDbAdapter.open();

		final Bundle bundle = getIntent().getExtras();
		// Inicijalizacija komunikacije
		ClientResource cr = new ClientResource(getString(R.string.server_url)
				+ "rest/tripLines");
		cr.getQuery().add("mestoOd", bundle.getString("mesto_od"));
		cr.getQuery().add("mestoDo", bundle.getString("mesto_do"));
		cr.getQuery().add("medjuMesto", bundle.getString("medju_mesto"));
		cr.getQuery().add("datum", bundle.getString("datum"));
		cr.getQuery().add("povlastice", bundle.getString("povlastice"));
		cr.getQuery().add("tip", bundle.getString("tip"));
		cr.getQuery().add("direktne", bundle.getString("direktne"));
		mTripLinesResource = cr.wrap(TripLineResourceI.class);

		// Initializes the alert dialog.
		mAlertDijalog = new AlertDialog.Builder(this).create();
		mAlertDijalog.setTitle("Greška");
		mAlertDijalog.setButton("OK", new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int which) {
				return;
			}
		});

		mProgresDijalog = ProgressDialog.show(this, "Pribavljanje podataka",
				"Učitavanje...", true, false);

		// pozadinski proces koji dobavlja podatke sa servera i puni ListView
		new DobaviRezultatePretrageTask().execute(new Void[] {});

		// ILI MOCK PODACI

	}

	@Override
	protected void onPause() {
		super.onPause();
	}

	@Override
	protected void onResume() {
		super.onResume();
	}

	private void adaptirajListView() {

		final String[] from = new String[] { MESTO_OD, BROJ_PRESEDANJA,
				MESTO_DO, INFO_BOX, OD_IKONICA, MEDJU_IKONICA, DO_IKONICA };
		final int[] to = new int[] { R.id.txv_mesto_od,
				R.id.txv_broj_presedanja, R.id.txv_mesto_do, R.id.txv_info,
				R.id.iv_Od, R.id.iv_medju, R.id.iv_Do };

		final ListView lv = (ListView) findViewById(R.id.lv_lista_rezultata);

		lv.setAdapter(new SimpleAdapter(this, mListaRezultata,
				R.layout.rezultati_pretrage_stavka, from, to));

		ModifikovaniOnItemClick modifikovaniOnItemClick = new ModifikovaniOnItemClick();
		modifikovaniOnItemClick.setTripLines(mTripLines);
		lv.setOnItemClickListener(modifikovaniOnItemClick);
	}

	private void napuniArrayListu(Vector<TripLine> tripLines) {
		// final lokalne promenljive radi najbrzeg pristupa
		final ArrayList<HashMap<String, Object>> lista = mListaRezultata;
		final int velicina = tripLines.size();

		for (int i = 0; i < velicina; i++) {
			HashMap<String, Object> mapa = new HashMap<String, Object>();
			mapa.put(MESTO_OD, tripLines.get(i).getMestoOd().getNaziv());
			mapa.put(MESTO_DO, tripLines.get(i).getMestoDo().getNaziv());

			mapa.put(BROJ_PRESEDANJA, tripLines.get(i).getBrojPresed()
					.toString());
			mapa.put(INFO_BOX, tripLines.get(i).getTrajanje() + " "
					+ tripLines.get(i).getUkupnaCena());
			mapa.put(OD_IKONICA,
					odrediIkonicu(tripLines.get(i), POCETNA_POZICIJA));
			mapa.put(MEDJU_IKONICA,
					odrediIkonicu(tripLines.get(i), SREDNJA_POZICIJA));
			mapa.put(DO_IKONICA,
					odrediIkonicu(tripLines.get(i), KRAJNJA_POZICIJA));

			lista.add(mapa);
		}
	}

	/** Pozadinski proces koji dobavlja podatke sa servera */
	private class DobaviRezultatePretrageTask extends
			AsyncTask<Void, Void, Integer> {
		protected Integer doInBackground(Void... args) {
			int rezultat = 0;
			try {
				final Vector<TripLine> tripLines = mTripLinesResource
						.allTripLines();
				if (tripLines != null) {
					napuniArrayListu(tripLines);
				} else {
					rezultat = 1;
				}
			} catch (ResourceException e) {
				rezultat = 1;
			}
			return rezultat;
		}

		protected void onPostExecute(Integer result) {
			mProgresDijalog.dismiss();
			switch (result) {
			case 0:
				// Ažuriraj GUI
				adaptirajListView();
				break;
			case 1:
				mAlertDijalog
						.setMessage(getString(R.string.greska_rezultati_pretrage));
				mAlertDijalog.show();
				break;
			default:
				break;
			}
		}
	}

	private Object odrediIkonicu(TripLine tripLine, int pozicija) {
		switch (pozicija) {
		// pocetna pozicija
		case POCETNA_POZICIJA: {
			if (tripLine.getPutneDuzi().get(0).getPrevoznik().getVrstaPrevoza()
					.getNaziv().equals("BUS"))
				return R.drawable.plavalevo;
			else
				return R.drawable.zelenalevo;
		}
			// pozicija za presedanje
		case SREDNJA_POZICIJA: {
			// ako nema presedanja srednju ikonicu ispisi istog tipa kao i prva
			// sto je
			if (tripLine.getBrojPresed() == 0) {
				if (tripLine.getPutneDuzi().get(0).getPrevoznik()
						.getVrstaPrevoza().getNaziv().equals("BUS"))
					return R.drawable.plavocelosredina;
				else
					return R.drawable.zelenocelosredina;
			}
			// ako ima presedanja uzecemo u za crtanje sredine prvo i poslednje
			// presedanje (POC. - 1 - 2 - 3 - 4 - KRAJ. ) uzecemo samo
			// izmedju POC. - 1 i izmedju 4 - KRAJ.)
			else {
				// ako je ovo, onda je prva linija busom
				String prva_duz = tripLine.getPutneDuzi().get(0).getPrevoznik()
						.getVrstaPrevoza().getNaziv();
				String poslednja_duz = tripLine.getPutneDuzi()
						.get(tripLine.getPutneDuzi().size() - 1).getPrevoznik()
						.getVrstaPrevoza().getNaziv();

				// proveravamo kombinacije BUS-BUS, BUS-VOZ, VOZ-BUS, VOZ-VOZ
				if (prva_duz.equals("BUS")) {
					// BUS - BUS
					if (poslednja_duz.equals("BUS"))
						return R.drawable.plavovsredina;
					else
						// BUS-VOZ
						return R.drawable.plavozelenosredina;
				} else {
					// VOZ - BUS
					if (poslednja_duz.equals("BUS"))
						return R.drawable.zelenoplavosredina;
					// VOZ-VOZ
					else
						//
						return R.drawable.zelenovsredina;
				}
			}
		}
			// krajnja pozicija
		case KRAJNJA_POZICIJA: {
			if (tripLine.getPutneDuzi().get(tripLine.getPutneDuzi().size() - 1)
					.getPrevoznik().getVrstaPrevoza().getNaziv().equals("BUS"))
				return R.drawable.plavadesno;
			else
				return R.drawable.zelenadesno1;
		}
		}
		return null;
	}

	@SuppressWarnings("unused")
	private void mockPodaci() {

		Calendar cal = Calendar.getInstance();
		cal.add(Calendar.HOUR, 2);

		this.mTripLines = new Vector<TripLine>();

		// MESTA POLASKA I DOLASKA
		MestoBean ns = new MestoBean(1, "NS");
		MestoBean bg = new MestoBean(2, "Bg");
		MestoBean nis = new MestoBean(3, "Nis");
		// KATEGORIJE PREVOZA
		TripCatBean kategorijaBus = new TripCatBean(1, "BUS");
		TripCatBean kategorijaVoz = new TripCatBean(2, "VOZ");
		// PREVOZNICI
		CarrierBean cbLasta = new CarrierBean(1, "Lasta", "adr", "em@il.rs",
				"222 333", kategorijaBus);
		CarrierBean cbNisExpress = new CarrierBean(2, "Nis Express", "adr1",
				"em@il.rs", "4 222 333", kategorijaBus);
		CarrierBean cbZeleznicaSrbije = new CarrierBean(3, "Zeleznice Srbije",
				"adr2", "em@il.rs", "4 222 333", kategorijaVoz);

		// PUTNE DUZI
		// 1-direkt NS-NIS
		// PRVA LINIJA
		TripPartBean putnaDuzNsNis1 = new TripPartBean(1, 100.0, Calendar
				.getInstance().getTime(), cal.getTime(), null, ns, nis, cbLasta);
		Vector<TripPartBean> duziLinijeNsNis1 = new Vector<TripPartBean>();
		duziLinijeNsNis1.add(putnaDuzNsNis1);
		TripLine putnaLinijaNs_Nis = new TripLine(duziLinijeNsNis1);

		this.mTripLines.add(putnaLinijaNs_Nis);
		// DRUGA LINIJA
		TripPartBean putnaDuzNsNis2 = new TripPartBean(2, 100.0, Calendar
				.getInstance().getTime(), cal.getTime(), null, ns, nis,
				cbNisExpress);
		Vector<TripPartBean> duziLinijeNsNis2 = new Vector<TripPartBean>();
		duziLinijeNsNis2.add(putnaDuzNsNis2);
		TripLine putnaLinijaNs_Nis2 = new TripLine(duziLinijeNsNis2);

		this.mTripLines.add(putnaLinijaNs_Nis2);

		// TRECA LINIJA,
		// DIREKT VOZ NS-NIS
		TripPartBean putnaDuzNsNis3 = new TripPartBean(3, 100.0, Calendar
				.getInstance().getTime(), cal.getTime(), null, ns, nis,
				cbZeleznicaSrbije);
		Vector<TripPartBean> duziLinijeNsNis3 = new Vector<TripPartBean>();
		duziLinijeNsNis3.add(putnaDuzNsNis3);
		TripLine putnaLinijaNs_Nis3 = new TripLine(duziLinijeNsNis3);

		this.mTripLines.add(putnaLinijaNs_Nis3);

		// CETVRTA LINIJA
		// PRESEDANJE U BEOGRADU BUS-VOZ
		TripPartBean putnaDuzNsBg = new TripPartBean(4, 70, Calendar
				.getInstance().getTime(), cal.getTime(), null, ns, bg,
				cbNisExpress);
		TripPartBean putnaDuzBgNis = new TripPartBean(5, 90, Calendar
				.getInstance().getTime(), cal.getTime(), null, bg, ns,
				cbZeleznicaSrbije);
		Vector<TripPartBean> duziLinijeNsNis4 = new Vector<TripPartBean>();
		duziLinijeNsNis4.add(putnaDuzNsBg);
		duziLinijeNsNis4.add(putnaDuzBgNis);
		TripLine putnaLinijaNs_Bg_Nis = new TripLine(duziLinijeNsNis4);

		this.mTripLines.add(putnaLinijaNs_Bg_Nis);

		// PETA LINIJA
		// PRESEDANJE U BEOGRADU BUS-BUS
		TripPartBean putnaDuzNsBg1 = new TripPartBean(4, 70, Calendar
				.getInstance().getTime(), cal.getTime(), null, ns, bg,
				cbNisExpress);
		TripPartBean putnaDuzBgNis1 = new TripPartBean(5, 90, Calendar
				.getInstance().getTime(), cal.getTime(), null, bg, ns, cbLasta);
		Vector<TripPartBean> duziLinijeNsNis5 = new Vector<TripPartBean>();
		duziLinijeNsNis5.add(putnaDuzNsBg1);
		duziLinijeNsNis5.add(putnaDuzBgNis1);
		TripLine putnaLinijaNs_Bg_Nis1 = new TripLine(duziLinijeNsNis5);

		this.mTripLines.add(putnaLinijaNs_Bg_Nis1);

		napuniArrayListu(this.mTripLines);
	}

	class ModifikovaniOnItemClick implements OnItemClickListener {
		Vector<TripLine> tripLines;

		public Vector<TripLine> getTripLines() {
			return tripLines;
		}

		public void setTripLines(Vector<TripLine> tripLines) {
			this.tripLines = tripLines;
		}

		@Override
		public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
				long arg3) {
			Intent i = new Intent(arg1.getContext(),
					IzabranaLinijaActivity.class);
			i.putExtra(IdemDoDbAdapter.KLJUC_PUTOVANJE_ID, arg2);

			// setujemo mu tripline koji je selektovan
			TripLine tp = tripLines.get(arg2);
			Bundle b = new Bundle();
			b.putSerializable(TRIP_LINE, tp);
			// bundle stavimo u extra podatke
			i.putExtra(TRIP_LINE, b);
			startActivityForResult(i, RESULT_OK);

		}

	}
}
